﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;

namespace CPPEI.Coolzon.UI.XProperty.Converters
{
    /*
     * DataSource 
     * 和
     * <DataSource Name="CDPDB">
        <DataSet Name="Test">
            <DataParameters>
                <DataParameter Name="p" Value="1"/>       
            </DataParameters>
        </DataSet>
        </DataSource>
     * 之间相互转换
     * */
    /// <summary>
    /// 数据源转换器        
    /// </summary>
    public class XDataSourceConverter : IPropertyValueConverter
    {
        public object Convert(ConvertContext context, Metadata.ValueNode valueNode)
        {
            // 构建数据源
            UI.DataSource dataSource = new DataSource();
            dataSource.Name = valueNode.Attributes["Name"];
            bool isStatic = false;
            if(valueNode.Attributes.ContainsKey("IsStatic"))
            {
                bool.TryParse(valueNode.Attributes["IsStatic"], out isStatic);
            }
            dataSource.IsStatic = isStatic;

            if (valueNode.ValueNodes != null && valueNode.ValueNodes.Count > 0)
            {
                // 构建数据集
                Metadata.ValueNode dataSetNode = valueNode.ValueNodes[0];
                UI.DataSet dataSet = new DataSet();
                dataSet.Name = dataSetNode.Attributes["Name"];
                dataSource.DataSet = dataSet;
                dataSet.Parameters = new List<DataParameter>();

                if(dataSetNode.ValueNodes != null && dataSetNode.ValueNodes.Count > 0)
                {
                    Metadata.ValueNode parametersNode = null;
                    for (int index = 0; index < dataSetNode.ValueNodes.Count; index++)
                    {
                        Metadata.ValueNode node = dataSetNode.ValueNodes[index];
                        if (node.Name == "DataParameters")
                        {
                            parametersNode = node;
                            break;
                        }
                    }

                    // 构建参数
                    if (parametersNode.ValueNodes != null)
                    {
                        for (int index = 0; index < parametersNode.ValueNodes.Count; index++)
                        {
                            Metadata.ValueNode parameterNode = parametersNode.ValueNodes[index];
                            UI.DataParameter parameter = new DataParameter();
                            parameter.Name = parameterNode.Attributes["Name"];
                            parameter.Type = parameterNode.Attributes.ContainsKey("Type") ? parameterNode.Attributes["Type"] : "IN";
                            parameter.ValueString = parameterNode.Attributes["Value"];
                            dataSet.Parameters.Add(parameter);
                        }
                    }
                }                
            }
            return dataSource;
        }

        public Metadata.ValueNode ConvertBack(ConvertContext context, object value)
        {
            UI.DataSource dataSource = (UI.DataSource)value;
            if (dataSource == null)
            {
                return null;
            }

            Metadata.ValueNode dataSourceNode = new Metadata.ValueNode("DataSource");
            dataSourceNode.Attributes = new Dictionary<string, string>();
            dataSourceNode.Attributes.Add("Name", dataSource.Name);
            dataSourceNode.Attributes.Add("IsStatic", dataSource.IsStatic ? bool.TrueString : bool.FalseString);

            if(dataSource.DataSet != null)
            {
                Metadata.ValueNode dataSetNode = new Metadata.ValueNode("DataSet");
                dataSetNode.Attributes = new Dictionary<string, string>();
                dataSetNode.Attributes.Add("Name", dataSource.DataSet.Name);
                dataSetNode.ValueNodes = new List<Metadata.ValueNode>();

                if(dataSource.DataSet.Parameters != null && dataSource.DataSet.Parameters.Count > 0)
                {
                    Metadata.ValueNode parametersNode = new Metadata.ValueNode("DataParameters");
                    dataSetNode.ValueNodes.Add(parametersNode);
                    for (int index = 0; index < dataSource.DataSet.Parameters.Count; index++)
                    {
                        Metadata.ValueNode parameterNode = new Metadata.ValueNode("DataParameter");
                        parameterNode.Attributes = new Dictionary<string, string>();
                        parameterNode.Attributes.Add("Name", dataSource.DataSet.Parameters[index].Name);
                        parameterNode.Attributes.Add("Value", dataSource.DataSet.Parameters[index].ValueString);
                        parameterNode.Attributes.Add("Type", dataSource.DataSet.Parameters[index].Type);
                        parametersNode.ValueNodes = new List<Metadata.ValueNode>();
                        parametersNode.ValueNodes.Add(parameterNode);
                    }
                }

                dataSourceNode.ValueNodes = new List<Metadata.ValueNode>();
                dataSourceNode.ValueNodes.Add(dataSetNode);
            }
            return dataSourceNode;
        }
    }
}
